package br.senac.arqpad.pizzaria.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.senac.arqpad.pizzaria.model.ClasseComId;
import br.senac.arqpad.pizzaria.model.Repository;

@SuppressWarnings({ "unchecked", "rawtypes" })
public class DAOMemoria<T> implements Repository<T> {
	
	private Class<T> tipoItem;
	
	protected static List repositorio;
	
	public DAOMemoria(Class<T> tipoItem) {
		//System.out.println("passou no construtor do DAOMemoria " + tipoItem);
		if (repositorio == null ) repositorio = new ArrayList<T>();
		this.tipoItem = tipoItem;
	}

	@Override
	public List<T> listarTodos() {
		System.out.println("conteudo do repositorio as " + (new Date()).toString() + " '" + tipoItem + "' " +  repositorio.size());
		System.out.println(repositorio);
		System.out.println("--------------------------------------------------");
		return repositorio;
	}
	
	/* (non-Javadoc)
	 * @see dao.DAO#getLista()
	 */
	@Override
	public List<T> getLista() {
		return listarTodos();
	}
	
	/* (non-Javadoc)
	 * @see dao.DAO#incluir(T)
	 */
	@Override
	public boolean incluir(T item) {
		boolean sucesso = repositorio.add(item);
		if (sucesso) {
			ClasseComId classeComId = (ClasseComId) item;
			classeComId.setId( (long) repositorio.size() );
			System.out.println("novo item '" + item + "' adicionado as " + (new Date()).toString() + ", agora tem '" + repositorio.size() + "' itens.");
		}
		return sucesso;		
	}

	/* (non-Javadoc)
	 * @see dao.DAO#alterar(T)
	 */
	@Override
	public boolean atualizar(T item) {
		boolean sucesso = repositorio.set(repositorio.indexOf(item), item) != null;
		if (sucesso) System.out.println("item '" + item + "' atualizado as " + (new Date()).toString());
		return sucesso;
	}
	
	/* (non-Javadoc)
	 * @see dao.DAO#excluir(T)
	 */
	@Override
	public boolean excluir(T item) {
		boolean sucesso = repositorio.remove(item); 
		if (sucesso) System.out.println("item '" + item + "' excluido as " + (new Date()).toString() + " , agora tem '" + repositorio.size() + "' itens.");
		return sucesso;				
	}
	
	/* (non-Javadoc)
	 * @see dao.DAO#obter(T)
	 */
	@Override
	public T obter(ClasseComId itemAObter) {
		if ( repositorio.indexOf(itemAObter) < 0 ) { throw new RuntimeException("Item de id '" + itemAObter.getId() + "' nao encontrado"); }
		T item = (T) repositorio.get(repositorio.indexOf(itemAObter));
		System.out.println("item '" + item + "' obtido  as " + (new Date()).toString());
		return item;		
	}
		
}
